package org.example.classtopia.Controller;

import org.example.classtopia.Common.Result.Result;
import org.example.classtopia.Model.dto.ReportCreateDTO;
import org.example.classtopia.Model.dto.ReportHandleDTO;
import org.example.classtopia.Model.dto.ReportQueryDTO;
import org.example.classtopia.Model.vo.PageResultVO;
import org.example.classtopia.Model.vo.ReportListVO;
import org.example.classtopia.Model.vo.ReportVO;
import org.example.classtopia.Service.ReportService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * 举报管理接口
 * 
 * 提供举报创建、查询、处理等功能。
 * 
 * - 提交举报：POST /api/report
 * - 查询举报详情：GET /api/report/{id}
 * - 查询我的举报记录：GET /api/report/my
 * - 分页查询所有举报：GET /api/report/page
 * - 处理举报：POST /api/report/handle
 */
@RestController
@RequestMapping("/report")
@CrossOrigin
public class ReportController {

    @Autowired
    private ReportService reportService;

    /**
     * 提交举报
     * @param reportCreateDTO 举报请求参数，包括举报人ID、被举报对象类型、被举报对象ID、举报原因
     * @return 举报ID，成功时返回200，失败时返回错误信息
     */
    @PostMapping
    public Result<Long> createReport(@RequestBody ReportCreateDTO reportCreateDTO) {
        try {
            Long reportId = reportService.createReport(reportCreateDTO);
            return Result.success("举报提交成功", reportId);
        } catch (Exception e) {
            return Result.error(400, e.getMessage());
        }
    }

    /**
     * 根据ID查询举报详情
     * @param id 举报ID
     * @return 举报详细信息，成功时返回200，失败时返回错误信息
     */
    @GetMapping("/{id}")
    public Result<ReportVO> getReportById(@PathVariable Long id) {
        try {
            ReportVO reportVO = reportService.getReportById(id);
            return Result.success(reportVO);
        } catch (Exception e) {
            return Result.error(400, e.getMessage());
        }
    }

    /**
     * 查询我的举报记录（分页）
     * @param reporterId 举报人ID
     * @param page 当前页码，默认1
     * @param size 每页数量，默认10
     * @return 举报记录分页列表
     */
    @GetMapping("/my")
    public Result<PageResultVO<ReportListVO>> getMyReports(
            @RequestParam Long reporterId,
            @RequestParam(defaultValue = "1") Integer page,
            @RequestParam(defaultValue = "10") Integer size) {
        try {
            PageResultVO<ReportListVO> result = reportService.getMyReports(reporterId, page, size);
            return Result.success(result);
        } catch (Exception e) {
            return Result.error(400, e.getMessage());
        }
    }

    /**
     * 分页查询所有举报（管理员用）
     * @param status 举报状态（可选：pending（待处理）/resolved（已解决）/rejected（已驳回））
     * @param targetType 被举报对象类型（可选：user（用户）/post（帖子）/comment（评论）/resource（资源））
     * @param page 当前页码，默认1
     * @param size 每页数量，默认10
     * @return 举报记录分页列表
     */
    @GetMapping("/page")
    public Result<PageResultVO<ReportListVO>> getReportsPage(
            @RequestParam(required = false) String status,
            @RequestParam(required = false) String targetType,
            @RequestParam(defaultValue = "1") Integer page,
            @RequestParam(defaultValue = "10") Integer size) {
        try {
            ReportQueryDTO queryDTO = new ReportQueryDTO();
            queryDTO.setStatus(status);
            queryDTO.setTargetType(targetType);
            queryDTO.setPage(page);
            queryDTO.setSize(size);
            
            PageResultVO<ReportListVO> result = reportService.getReportsPage(queryDTO);
            return Result.success(result);
        } catch (Exception e) {
            return Result.error(400, e.getMessage());
        }
    }

    /**
     * 处理举报（管理员操作）
     * @param handleDTO 处理举报请求参数，包括举报ID、处理人ID、处理状态、处理结果说明
     * @return 操作结果，成功时返回200，失败时返回错误信息
     */
    @PostMapping("/handle")
    public Result<Void> handleReport(@RequestBody ReportHandleDTO handleDTO) {
        try {
            reportService.handleReport(handleDTO);
            return Result.success();
        } catch (Exception e) {
            return Result.error(400, e.getMessage());
        }
    }
}
